定期ミートアップ 第63回
現状はMLIRを使っているが、そのうちLLVMに移行する予定
GPU用のコードを吐きたいとかなら便利そう
code:txt
extern print(Int n) -> Null
extern(async) sleep_sec(Int n) -> Null
fun chiika_main() -> Null {
print(123)
sleep_sec(1)
print(456)
return null
}
print、sleep_secはRustで書かれた関数
sleep_secの呼び出しのところで関数を2つに分ける
code:mlir
func.func @chiika_main(%arg0: !llvm.ptr, %arg1: (!llvm.ptr, i64) -> !llvm.ptr) -> !llvm.ptr {
%f = constant @chiika_env_push : (!llvm.ptr, !llvm.ptr) -> i64
%0 = builtin.unrealized_conversion_cast %arg1 : (!llvm.ptr, i64) -> !llvm.ptr to !llvm.ptr
%1 = call_indirect %f(%arg0, %0) : (!llvm.ptr, !llvm.ptr) -> i64
%f_0 = constant @print : (i64) -> i64
%c123_i64 = arith.constant 123 : i64
%2 = call_indirect %f_0(%c123_i64) : (i64) -> i64
%f_1 = constant @sleep_sec : (!llvm.ptr, (!llvm.ptr, i64) -> !llvm.ptr, i64) -> !llvm.ptr
%f_2 = constant @chiika_main_1 : (!llvm.ptr, i64) -> !llvm.ptr
%c1_i64 = arith.constant 1 : i64
%3 = call_indirect %f_1(%arg0, %f_2, %c1_i64) : (!llvm.ptr, (!llvm.ptr, i64) -> !llvm.ptr, i64) -> !llvm.ptr
return %3 : !llvm.ptr
}
func.func @chiika_main_1(%arg0: !llvm.ptr, %arg1: i64) -> !llvm.ptr {
%f = constant @print : (i64) -> i64
%c456_i64 = arith.constant 456 : i64
%0 = call_indirect %f(%c456_i64) : (i64) -> i64
%f_0 = constant @chiika_env_pop : (!llvm.ptr, i64) -> !llvm.ptr
%c1_i64 = arith.constant 1 : i64
%1 = call_indirect %f_0(%arg0, %c1_i64) : (!llvm.ptr, i64) -> !llvm.ptr
%2 = builtin.unrealized_conversion_cast %1 : !llvm.ptr to (!llvm.ptr, i64) -> !llvm.ptr
%c0_i64 = arith.constant 0 : i64
%3 = call_indirect %2(%arg0, %c0_i64) : (!llvm.ptr, i64) -> !llvm.ptr
return %3 : !llvm.ptr
}
できたこと:Rust側関数をまたいだ無限ループ
作業中:if式の中に非同期関数呼び出しがあるケース
https://gyazo.com/215becbf8459961b06fe394848e3f535
やりたいこと:
並列実行
クロージャの実装
non-local exit